home *** CD-ROM | disk | FTP | other *** search
- "
- Lists are implemented using Points in order to
- reduce the number of classes in the standard prelude
- "
- Class List :SequenceableCollection
- | first current |
- [
- add: anItem
- first <- (Point new x: anItem ) y: first .
- ^ anItem
- |
- addFirst: anItem
- first <- (Point new x: anItem ) y: first .
- ^ anItem
- |
- addLast: anItem
- (first isNil)
- ifTrue: [^ self addFirst: anItem].
- (self findLast) y: ((Point new x: anItem) y: nil).
- ^ anItem
- |
- addAllFirst: aCollection
- aCollection do: [:x | self addFirst: x]
- |
- addAllLast: aCollection
- aCollection do: [:x | self addLast: x]
- |
- coerce: aCollection | newList |
- newList <- List new.
- aCollection do: [:x | newList addLast: x].
- ^ newList
- |
- findLast | item |
- ((item <- first) isNil)
- ifTrue: [^ nil].
- [(item y) notNil]
- whileTrue: [item <- item y].
- ^ item
- |
- remove: anItem
- ^ self remove: anItem
- ifAbsent: [self error: 'cant find item']
- |
- remove: anItem ifAbsent: exceptionBlock
- (first isNil)
- ifTrue: [^ exceptionBlock value].
- self inject: nil into: [:prev :current |
- (current x == anItem)
- ifTrue: [(prev isNil)
- ifTrue: [first <- current y]
- ifFalse: [prev y: (current y)].
- ^ anItem].
- current ] .
- ^ exceptionBlock value
- |
- removeError
- ^ self error: 'cannot remove from an empty list'
- |
- removeFirst | item |
- (first isNil)
- ifTrue: [^ self removeError].
- item <- first.
- first <- first y.
- ^ item x
- |
- removeLast
- (first isNil)
- ifTrue: [^ self removeError].
- ^ self remove: self last
- ifAbsent: [self removeError]
- |
- first
- ^ ((current <- first) notNil)
- ifTrue: [ current x ]
- |
- next
- ^ ((current <- current y) notNil)
- ifTrue: [ current x ]
- |
- current
- ^ current x
- |
- last
- (first isNil)
- ifTrue: [^ nil].
- ^ self findLast x
- |
- isEmpty
- ^ first == nil
- ]
-